﻿/* 
* Copyright (c) 2010, The University of Texas at Austin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, 
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, 
* this list of conditions and the following disclaimer in the documentation and/or other materials 
* provided with the distribution.
*
* Neither the name of The University of Texas at Austin nor the names of its contributors may be 
* used to endorse or promote products derived from this software without specific prior written 
* permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Bio.Data.Interfaces.Drawing;

namespace Bio.Data.Providers.Structure
{
    public class RNASecondaryStructureNucleotideCircleShape : ICircleShape
    {
        public static RNASecondaryStructureNucleotideCircleShape FromRNAML(IEnumerable<XComment> formattingcomments)
        {
            RNASecondaryStructureNucleotideCircleShape retValue = null;
            foreach (var ntformattingcomment in formattingcomments)
            {
                if (!string.IsNullOrEmpty(ntformattingcomment.Value) && ntformattingcomment.Value.StartsWith(RNAMLTags.StrMLExtension))
                {
                    string[] fields = Regex.Split(ntformattingcomment.Value, "::");
                    if (fields.Length == 3 && fields[0].Equals(RNAMLTags.StrMLExtension))
                    {
                        if (fields[1].Equals(RNAStructureModelXMLTags.StructureModelNucleotideCircleDiameterLabel))
                        {
                            if (retValue == null)
                                retValue = new RNASecondaryStructureNucleotideCircleShape();

                            double diameter;
                            if (double.TryParse(fields[2], out diameter))
                            {
                                if (diameter > 0.0)
                                    retValue.Diameter = diameter;
                            }
                        }
                        else if (fields[1].Equals(RNAStructureModelXMLTags.StructureModelNucleotideCircleFilledLabel))
                        {
                            if (retValue == null)
                                retValue = new RNASecondaryStructureNucleotideCircleShape();

                            bool filled = false;
                            if(bool.TryParse(fields[2], out filled))
                                retValue.Filled = filled;
                        }
                        else if (fields[1].Equals(RNAStructureModelXMLTags.StructureModelNucleotideCircleEdgeThicknessLabel))
                        {
                            if (retValue == null)
                                retValue = new RNASecondaryStructureNucleotideCircleShape();

                            double edgeThickness;
                            if (double.TryParse(fields[2], out edgeThickness))
                            {
                                if (edgeThickness > 0.0)
                                    retValue.EdgeThickness = edgeThickness;
                            }
                        }
                        else if (fields[1].Equals(RNAStructureModelXMLTags.StructureModelNucleotideCircleFillLabel))
                        {
                            if (retValue == null)
                                retValue = new RNASecondaryStructureNucleotideCircleShape();

                            retValue.FillColor = fields[2];
                        }
                        else if (fields[1].Equals(RNAStructureModelXMLTags.StructureModelNucleotideCircleEdgeFillLabel))
                        {
                            if (retValue == null)
                                retValue = new RNASecondaryStructureNucleotideCircleShape();

                            retValue.EdgeColor = fields[2];
                        }
                    }
                }
            }
            return retValue;
        }

        public static RNASecondaryStructureNucleotideCircleShape FromXML(XElement props)
        {
            if (props != null &&
                !props.IsEmpty)
            {
                RNASecondaryStructureNucleotideCircleShape retValue = null;
                XElement nucleotideCircleDiameter = props.Element(RNAStructureModelXMLTags.StructureModelNucleotideCircleDiameterLabel);
                XElement nucleotideCircleEdgeThickness = props.Element(RNAStructureModelXMLTags.StructureModelNucleotideCircleEdgeThicknessLabel);
                XElement nucleotideCircleIsFilled = props.Element(RNAStructureModelXMLTags.StructureModelNucleotideCircleFilledLabel);
                XElement nucleotideCircleFill = props.Element(RNAStructureModelXMLTags.StructureModelNucleotideCircleFillLabel);
                XElement nucleotideCircleStroke = props.Element(RNAStructureModelXMLTags.StructureModelNucleotideCircleEdgeFillLabel);

                double diameter;
                if (nucleotideCircleDiameter != null &&
                    !nucleotideCircleDiameter.IsEmpty &&
                    double.TryParse(nucleotideCircleDiameter.Value, out diameter))
                {
                    if (retValue == null)
                        retValue = new RNASecondaryStructureNucleotideCircleShape();

                    if(diameter > 0.0)
                        retValue.Diameter = diameter;
                }

                double edgeThickness;
                if (nucleotideCircleEdgeThickness != null &&
                    !nucleotideCircleEdgeThickness.IsEmpty &&
                    double.TryParse(nucleotideCircleEdgeThickness.Value, out edgeThickness))
                {
                    if (retValue == null)
                        retValue = new RNASecondaryStructureNucleotideCircleShape();

                    if(edgeThickness > 0.0)
                        retValue.EdgeThickness = edgeThickness;
                }

                bool filled;
                if (nucleotideCircleIsFilled != null &&
                    !nucleotideCircleIsFilled.IsEmpty &&
                    bool.TryParse(nucleotideCircleIsFilled.Value, out filled))
                {
                    if (retValue == null)
                        retValue = new RNASecondaryStructureNucleotideCircleShape();

                    retValue.Filled = filled;
                }

                if (nucleotideCircleFill != null &&
                    !nucleotideCircleFill.IsEmpty)
                {
                    if (retValue == null)
                        retValue = new RNASecondaryStructureNucleotideCircleShape();

                    retValue.FillColor = nucleotideCircleFill.Value;
                }

                if (nucleotideCircleStroke != null &&
                    !nucleotideCircleStroke.IsEmpty)
                {
                    if (retValue == null)
                        retValue = new RNASecondaryStructureNucleotideCircleShape();

                    retValue.EdgeColor = nucleotideCircleStroke.Value;
                }

                return retValue;
            }
            else { return null; }
        }

        #region ICircleShape Members

        public bool? Filled { get; set; }
        public string FillColor { get; set; }
        public double Diameter { get; set; }
        public double EdgeThickness { get; set; }
        public string EdgeColor { get; set; }

        #endregion
    }
}
